package cn.ibdsr.human.util;

import cn.ibdsr.human.constant.BizConstants;
import cn.ibdsr.human.constant.ErrorTypeEnum;
import cn.ibdsr.human.constant.Result;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletResponse;

/**
 * Result的工具类
 * @author chenglx
 * @version V1.0
 * @date 2020/7/3 15:51
 * <p>
 * Date Author Description
 * ------------------------------------------------------
 * 2020/7/3 chenglx init
 */
@Slf4j
public class ResultUtils {

    /**
     * 将 Result 对象转换成 HTTP 响应
     *
     * @param result
     * @param <T>
     * @return
     */
    public static <T> Object toHttpResponse(Result<T> result) {
        return toHttpResponse(result, HttpServletUtils.getResponse());
    }

    /**
     * 将 Result 对象转换成 HTTP 响应
     *
     * @param result
     * @param <T>
     * @return
     */
    public static <T> Object toHttpResponse(Result<T> result, HttpServletResponse response) {
        // 请求处理成功
        if (result.isSuccess()) {
            response.setStatus(HttpServletResponse.SC_OK);
            return result.getModel();
        }

        // 处理失败的情况
        response.setStatus(result.getHttpStatusCode());
        // body中返回具体的错误提示
        return createErrorMessageBody(result.getErrorMsg());
    }

    /**
     * 成功响应，直接将data作为HTTP响应body
     * @param <T> 数据data
     * @return
     */
    public static <T> Object toHttpResponse(T data) {
        HttpServletUtils.getResponse().setStatus(HttpServletResponse.SC_OK);
        return data;
    }

    /**
     * 构造关于错误信息的HTTP响应body
     * @return
     */
    public static JSONObject createErrorMessageBody(ErrorTypeEnum errorTypeEnum) {
        return createErrorMessageBody(errorTypeEnum.getDesc());
    }

    /**
     * 构造关于错误信息的HTTP响应body
     * @return
     */
    public static JSONObject createErrorMessageBody(String errorMsg) {
        JSONObject object = new JSONObject(2);
        object.put(BizConstants.ERROR_MSG_KEY, errorMsg);
        return object;
    }

    /**
     * 构造响应成功的Result实例
     * @param <T> 数据data
     * @return Result实例
     */
    public static <T> Result<T> newSuccessResult(T data) {
        Result<T> result = new Result();
        result.setSuccess(true);
        result.setModel(data);
        return result;
    }

    /**
     * 构造响应成功的Result实例
     * @return Result实例
     */
    public static <T> Result<T> newSuccessResult() {
        return newSuccessResult(null);
    }
}
